1261
11580
V současné době píšu základní analyzátor pro XML příchuť. Jako cvičení implementuji analyzátor řízený tabulkou LL.
Toto je můj příklad gramatiky BNF:
% datový řetězec názvu tokenu
%% / * LL (1) * /
doc: elem
elem: "<" open_tag
open_tag: name attr close_tag
close_tag: ">" elem_or_data ""
| „/>“
;
elem_or_data: "<" open_tag elem_or_data
| data elem_or_data
| / * epsilon * /
;
attr: name ":" řetězec attr
| / * epsilon * /
;
Je tato gramatika správná?
Každý koncový literál je mezi uvozovkami. Abstraktní terminály jsou specifikovány% tokenem.
Kóduji ručně psaný lexer, který převede můj vstup do seznamu tokenů. Jak bych tokenizoval abstraktní terminály? 
Klasickým přístupem by bylo napsat regulární výraz (nebo jiný rozpoznávač) pro každý možný terminál.
To, co nazýváte „abstraktní“ terminály, které jsou naprosto konkrétní, jsou ve skutečnosti terminály, jejichž přidružené vzory rozpoznávají více než jeden možný vstupní řetězec. Řetězec skutečně rozpoznaný (nebo nějaká vypočítaná funkce tohoto řetězce) by měl být předán analyzátoru jako sémantická hodnota tokenu.
Nominálně v každém bodě vstupního řetězce spustí tokeniser všechny rozpoznávače a vybere ten s nejdelší shodou. (Toto je takzvané pravidlo „maximálního žvýkání“.) Toto lze obvykle optimalizovat, zvláště pokud jsou všechny vzory regulárními výrazy. (F) lex tuto optimalizaci provede například za vás.
Komplikace ve vašem případě spočívá v tom, že tokenizace vašeho jazyka závisí na kontextu. Zejména když je cíl elem_or_data, jediné možné tokeny jsou <,